package design_pattern.CountDownMode;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream;

/**
 * @Author: 蔡翔
 * @Date: 2019/11/15 10:43
 * @Version 1.0
 * 场景：第一过程 你开出去很多个线程去执行任务 ，但是第二过程必须等第一过程全部执行完毕后才能 执行，所以这时候就需要CountDown
 */
public class JDKCountDown {
    private static final Random random = new Random(System.currentTimeMillis());
    public static void main(String[] args) throws InterruptedException {
        //注意这里的 5 ，代表的是5个线程， 一定要和 你下面的线程数想对应
        final CountDownLatch latch = new CountDownLatch(5);

        System.out.println("准备多线程任务");
        //the first phase
        IntStream.rangeClosed(1,5).forEach(i->{
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"is working.");
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDown();
            },String.valueOf(i)).start();
        });
        //等着。等着所有的线程都结束了，在执行后面的代码，
        latch.await();

        //the second phase
        //想等 上面任务完成了 再执行 下面的任务，之前的解决方式 是加入 join(),现在可以用java自带的CountDown
        System.out.println("多线程任务全部结束，准备第二阶段任务");
        System.out.println("...............................");
        System.out.println("FINISH");
    }
}